/**
由于使用数组实现循环队列时会出现从尾下标到0下标的情况
所以使用 （n+1）% length 来维护i的下一个下标*/
class MyCircularQueue {
    int[] elem;
    int front;
    int rear;
    public MyCircularQueue(int k) {
        //由于我们浪费一个空间来判满，故在构造时需要多加一个空间
        elem = new int[k+1];
    }
    
    /**
    判满 ？满 无法插入，return false ：不满 继续执行下列代码
    在rear位置插入新元素，将rear维护到下一个位置，return true*/
    public boolean enQueue(int value) {
        //入队列
        if(isFull()) {
            return false;
        }
        elem[rear] = value;
        rear = (rear+1)%elem.length;
        return true;
    }
    
    /**
    判空 ？空 无法删除，return false ： 不空 继续执行下列代码
    维护front 走到下一个位置，即可实现删除*/
    public boolean deQueue() {
        //出队列
        if(isEmpty()) {
            return false;
        }
        front = (front+1)%elem.length;
        return true;
    }
    
    public int Front() {
        if(isEmpty()) {
            return -1;
        }
        return elem[front];
    }
    
    /**
    返回尾节点
    判空 ？空 return -1 ：继续执行下列代码
    先对rear当前位置判断，若rear==0则需要特定维护，若rear！=0，正常rear-1*/
    public int Rear() {
        if(isEmpty()) {
            return -1;
        }
        int index = rear==0?elem.length-1:rear-1;
        return elem[index];
    }
    
    public boolean isEmpty() {
        return rear == front;
    }
    
    public boolean isFull() {
        //使用浪费一个空间的方式判满
        return (rear+1)%elem.length == front;
    }
}